home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Developer Toolbox 6.1
/
SGI Developer Toolbox 6.1 - Disc 4.iso
/
src
/
demos
/
GL
/
atlantis
/
contour.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-01
|
6KB
|
205 lines
/*
* Copyright 1992, 1993, 1994, Silicon Graphics, Inc.
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
* the contents of this file may not be disclosed to third parties, copied or
* duplicated in any form, in whole or in part, without the prior written
* permission of Silicon Graphics, Inc.
*
* RESTRICTED RIGHTS LEGEND:
* Use, duplication or disclosure by the Government is subject to restrictions
* as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
* and Computer Software clause at DFARS 252.227-7013, and/or in similar or
* successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
* rights reserved under the Copyright Laws of the United States.
*/
#include <stdio.h>
#include "gl.h"
unsigned long *longimagedata();
float texture_props[] = {TX_MINFILTER,TX_BILINEAR,TX_MAGFILTER,TX_BILINEAR,0};
float env_props[] = {TV_NULL}; /* use default texture environment properties */
/*
* texinit reads in, defines, and binds the texture. It also
* defines the texture environment, and it sets up and turns on
* the texture generation.
*
*/
void
texinit(void)
{
long *image; /* the image to be used as the texture */
long width, height;
/* in T, the z-component C should be such that C * Max Amp is about 0.5,
with D also 0.5, which makes the equation work between 0.0 and 1.0
For a mathematically defined sea, Max Amp is 0.5 tmies the sum of all wave term amplitudes */
static float t_params[4] = { 0., 0., 0.0005, 0.}; /* plane for T-coordinates */
/* in S, all experiments are valid */
static float s_params[4] = { 0.0005, 0., 0., 0.}; /* plane for S-coordinates */
image = (long *) longimagedata("sea.rgb", &width, &height);
if (image == NULL) {
fprintf(stderr, "Cannot find file sea.rgb -- texturing disabled\n");
return;
}
texdef2d(1,4,width,height,(const unsigned int *) image,1,texture_props);
tevdef(1,1,env_props);
tevbind(TV_ENV0,1);
texgen(TX_T, TG_CONTOUR, t_params);
texgen(TX_S, TG_CONTOUR, s_params);
}
#include "gl.h"
#include "device.h"
#include "gl/image.h"
struct picture {
unsigned long image[16384];
} icommon_ ;
void *longimagedata_(name, width, height)
char *name;
long *width, *height;
{
unsigned long *longimagedata();
unsigned long *temp;
register int i;
temp = longimagedata(name,width,height);
if (!temp) return NULL;
for (i = 0; i < 16384; i++)
icommon_.image[i] = temp[i];
}
unsigned long *longimagedata(name, width, height)
char *name;
long *width, *height;
{
unsigned long *base, *lptr;
short *rbuf, *gbuf, *bbuf, *abuf;
IMAGE *image;
int y;
image = iopen(name,"r");
if(!image) {
return NULL;
}
*width = image->xsize;
*height = image->ysize;
base = (unsigned long *)malloc(image->xsize*image->ysize*sizeof(unsigned long));
rbuf = (short *)malloc(image->xsize*sizeof(short));
gbuf = (short *)malloc(image->xsize*sizeof(short));
bbuf = (short *)malloc(image->xsize*sizeof(short));
abuf = (short *)malloc(image->xsize*sizeof(short));
if(!base || !rbuf || !gbuf || !bbuf) {
fprintf(stderr,"longimagedata: can't malloc enough memory\n");
exit(1);
}
lptr = base;
for(y=0; y<image->ysize; y++) {
if(image->zsize>=4) {
getrow(image,rbuf,y,0);
getrow(image,gbuf,y,1);
getrow(image,bbuf,y,2);
getrow(image,abuf,y,3);
rgbatocpack(rbuf,gbuf,bbuf,abuf,lptr,image->xsize);
lptr += image->xsize;
} else if(image->zsize==3) {
getrow(image,rbuf,y,0);
getrow(image,gbuf,y,1);
getrow(image,bbuf,y,2);
rgbtocpack(rbuf,gbuf,bbuf,lptr,image->xsize);
lptr += image->xsize;
} else {
getrow(image,rbuf,y,0);
bwtocpack(rbuf,lptr,image->xsize);
lptr += image->xsize;
}
}
iclose(image);
free(rbuf);
free(gbuf);
free(bbuf);
free(abuf);
return base;
}
bwtocpack(b,l,n)
register unsigned short *b;
register unsigned long *l;
register int n;
{
while(n>=8) {
l[0] = 0x00010101*b[0];
l[1] = 0x00010101*b[1];
l[2] = 0x00010101*b[2];
l[3] = 0x00010101*b[3];
l[4] = 0x00010101*b[4];
l[5] = 0x00010101*b[5];
l[6] = 0x00010101*b[6];
l[7] = 0x00010101*b[7];
l += 8;
b += 8;
n -= 8;
}
while(n--)
*l++ = 0x00010101*(*b++);
}
rgbtocpack(r,g,b,l,n)
register unsigned short *r, *g, *b;
register unsigned long *l;
register int n;
{
while(n>=8) {
l[0] = r[0] | (g[0]<<8) | (b[0]<<16);
l[1] = r[1] | (g[1]<<8) | (b[1]<<16);
l[2] = r[2] | (g[2]<<8) | (b[2]<<16);
l[3] = r[3] | (g[3]<<8) | (b[3]<<16);
l[4] = r[4] | (g[4]<<8) | (b[4]<<16);
l[5] = r[5] | (g[5]<<8) | (b[5]<<16);
l[6] = r[6] | (g[6]<<8) | (b[6]<<16);
l[7] = r[7] | (g[7]<<8) | (b[7]<<16);
l += 8;
r += 8;
g += 8;
b += 8;
n -= 8;
}
while(n--)
*l++ = *r++ | ((*g++)<<8) | ((*b++)<<16);
}
rgbatocpack(r,g,b,a,l,n)
register unsigned short *r, *g, *b, *a;
register unsigned long *l;
register int n;
{
while(n>=8) {
l[0] = r[0] | (g[0]<<8) | (b[0]<<16) | (a[0]<<24);
l[1] = r[1] | (g[1]<<8) | (b[1]<<16) | (a[1]<<24);
l[2] = r[2] | (g[2]<<8) | (b[2]<<16) | (a[2]<<24);
l[3] = r[3] | (g[3]<<8) | (b[3]<<16) | (a[3]<<24);
l[4] = r[4] | (g[4]<<8) | (b[4]<<16) | (a[4]<<24);
l[5] = r[5] | (g[5]<<8) | (b[5]<<16) | (a[5]<<24);
l[6] = r[6] | (g[6]<<8) | (b[6]<<16) | (a[6]<<24);
l[7] = r[7] | (g[7]<<8) | (b[7]<<16) | (a[7]<<24);
l += 8;
r += 8;
g += 8;
b += 8;
a += 8;
n -= 8;
}
while(n--)
*l++ = *r++ | ((*g++)<<8) | ((*b++)<<16) | ((*a++)<<24);
}